import aiomysql

async def add_database(pool: aiomysql.Pool, db_name: str) -> None:
    """
    检查指定数据库是否存在，如果不存在则自动创建并切换到该数据库
    
    该函数会先检查指定的数据库是否存在，如果不存在则自动创建该数据库
    并立即切换到新创建的数据库。适用于需要在程序运行时动态创建
    并使用数据库的场景。
    
    Args:
        pool: aiomysql连接池对象，用于获取数据库连接
        db_name: 要检查/创建的数据库名称，必须是有效的MySQL数据库名
    
    Returns:
        None: 该函数没有返回值
    
    Raises:
        aiomysql.Error: 如果数据库操作失败会抛出异常
    """
    async with pool.acquire() as conn:
        async with conn.cursor() as cur:
            # 检查数据库是否存在
            await cur.execute(f"SHOW DATABASES LIKE '{db_name}'") if db_name else await cur.execute("SHOW DATABASES")
            result = await cur.fetchone()
            
            # 如果数据库不存在则创建并切换
            if not result:
                await cur.execute(f"CREATE DATABASE IF NOT EXISTS {db_name}")



async def get_all_databases(pool: aiomysql.Pool) -> list[str]:
    """
    查询所有数据库名称
    
    该函数会返回MySQL服务器上所有数据库的名称列表。
    适用于需要获取数据库列表进行后续操作的场景。
    
    Args:
        pool: aiomysql连接池对象，用于获取数据库连接
    
    Returns:
        list[str]: 包含所有数据库名称的列表
    
    Raises:
        aiomysql.Error: 如果数据库操作失败会抛出异常
    """
    async with pool.acquire() as conn:
        async with conn.cursor() as cur:
            # 查询所有数据库
            await cur.execute("SHOW DATABASES")
            return [db[0] for db in await cur.fetchall()]


async def has_database(pool: aiomysql.Pool, db_name: str) -> bool:
    """
    检查指定数据库是否存在
    
    该函数会检查指定的数据库是否存在，返回布尔值表示结果。
    适用于需要验证数据库是否存在的场景。
    
    Args:
        pool: aiomysql连接池对象，用于获取数据库连接
        db_name: 要检查的数据库名称，必须是有效的MySQL数据库名
    
    Returns:
        bool: 如果数据库存在返回True，否则返回False
    
    Raises:
        aiomysql.Error: 如果数据库操作失败会抛出异常
    """
    async with pool.acquire() as conn:
        async with conn.cursor() as cur:
            # 检查数据库是否存在
            await cur.execute(f"SHOW DATABASES LIKE '{db_name}'")
            return bool(await cur.fetchone())


async def delete_database(pool: aiomysql.Pool, db_name: str) -> None:
    """
    删除指定的数据库
    
    该函数会删除指定的数据库，如果数据库不存在则不会抛出异常。
    适用于需要在程序运行时动态清理数据库的场景。
    
    Args:
        pool: aiomysql连接池对象，用于获取数据库连接
        db_name: 要删除的数据库名称，必须是有效的MySQL数据库名
    
    Returns:
        None: 该函数没有返回值
    
    Raises:
        aiomysql.Error: 如果数据库操作失败会抛出异常
    """
    async with pool.acquire() as conn:
        async with conn.cursor() as cur:
            # 删除数据库
            await cur.execute(f"DROP DATABASE IF EXISTS {db_name}")